package cn.xenosp.server.config.activiti;

import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.delegate.event.ActivitiEvent;
import org.activiti.engine.delegate.event.ActivitiEventListener;
import org.springframework.stereotype.Component;

/**
 * 项目名： service-web
 * 包路径： cn.xenosp.server.config.activiti
 * 作者：   TongHui
 * 创建时间: 2025-03-25 16:22
 * 描述: TODO
 * 版本: 1.0
 */
@Slf4j
@Component
public class GlobaActivitiEventListener implements ActivitiEventListener {
    @Override
    public void onEvent(ActivitiEvent activitiEvent) {
        log.info("全局监听器："+activitiEvent.getType());
        switch (activitiEvent.getType()) {
            case TASK_CREATED:
                /**
                 * 创建了新任务。此事件在任务完全初始化时抛出（在 TaskListener.EVENTNAME_CREATE 之前）。
                 */
                break;
            case TASK_ASSIGNED:
                /**
                 * 分配了任务。此事件与 {@link #ENTITY_UPDATED} 事件一起抛出。
                 */
                break;
            case TASK_COMPLETED:
                /**
                 * 完成了任务。此事件在任务实体删除之前（即 {@link #ENTITY_DELETED} 事件之前）抛出。如果任务属于流程，则此事件在流程移动之前抛出，结果是完成任务后会抛出一个 {@link #ACTIVITY_COMPLETED} 事件。
                 */
                break;
            case PROCESS_STARTED:
                /**
                 * 流程实例已启动。当启动先前创建的流程实例时抛出此事件。事件 PROCESS_STARTED 在相关事件 ENTITY_INITIALIZED 之后抛出。
                 */
                break;
            case PROCESS_COMPLETED:
                /**
                 * 流程已完成。在最后一个活动完成（即 ACTIVITY_COMPLETED）后抛出此事件。流程完成是指流程实例没有可采取的任何转换状态。
                 */
                break;
            case PROCESS_COMPLETED_WITH_ERROR_END_EVENT:
                /**
                 * 流程以错误结束事件完成。
                 */
                break;
            case PROCESS_CANCELLED:
                /**
                 * 流程已被取消。当通过以下方法删除流程实例时抛出此事件：
                 *
                 * @see org.activiti.engine.impl.RuntimeServiceImpl#deleteProcessInstance(java.lang.String, java.lang.String)，在数据库删除之前。
                 */
                break;
        }
    }

    /**
     * 上面的 onEvent 方法抛出异常的后续处理动作
     * false :表示忽略onEvent()方法方法中抛出的异常
     * true :表示onEvent()方法中抛出的异常继续向上传播，导致当前操作失败
     */
    @Override
    public boolean isFailOnException() {
        return true;
    }
}
